	org 0x7c00

	mov sp,0x7c00

	;清屏
	mov ax,0x0600
	mov bh,0x07
	mov cx,0
	mov dx,0x184f
	int 0x10

	;读取硬盘的第2扇区并加载到内存0x800的位置
	mov eax,0x02	;起始扇区lba地址
	mov bx,0x800    ;写入的内存地址
	mov cx,4        ;待读入的扇区数
	call read_disk
	jmp 0x800

;读硬盘方法
read_disk:
	mov esi,eax	;备份lba扇区号
	mov di,cx	;备份
	
	;设置要读取的扇区数
	mov dx,0x1f2
	mov al,cl
	out dx,al
	mov eax,esi	;恢复
	
	;设置LBA地址
	mov cl,8
	;0-7位的lba
	mov dx,0x1f3
	out dx,al
	;8-15位的lba
	mov dx,0x1f4
	shr eax,cl
	out dx,al
	;16-23位的lba
	mov dx,0x1f5
	shr eax,cl
	out dx,al
	;24-27位的lba
	mov dx,0x1f6
	shr eax,cl
	and al,0x0f	;lba的24-27位
	or al,0xe0	;另外4位为1110，表示lba模式
	out dx,al
	
	;请求读取硬盘
	mov dx,0x1f7
	mov al,0x20
	out dx,al

.wait:			;等待硬盘准备好
	nop
	in al,dx
	and al,0x88	;第4位为1表示准备好，第7位为1表示忙
	cmp al,0x08
	jnz .wait
	
	;读数据
	mov ax,di
	mov dx,256
	mul dx
	mov cx,ax
	
	mov dx,0x1f0
	.read_loop:
		in ax,dx
		mov [bx],ax
		add bx,2
		loop .read_loop
		ret

times 510-($-$$) db 0
db 0x55,0xaa